/**
 * @Date 2025/1/8 10:29
 * @Created by 衡盛永
 */

package org.example.deploy.config;

import org.example.deploy.common.ShiroRealm;
//import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
//import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

//@Configuration
public class ShiroConfig {

    // @Autowired
    // private ShiroFilter shiroCustomFilter;

//    /**
//     * 核心管理器：DefaultWebSecurityManager 是 Shiro 的核心安全管理器，负责所有与安全相关的操作，包括认证、授权、会话管理和缓存。
//     * 关联 Realm：通过 setRealm() 方法将自定义的 MyRealm 设置到 SecurityManager 中，用于处理认证和授权的具体逻辑。
//     * Shiro 的其他组件（如过滤器和工具类）依赖于 SecurityManager 来执行安全检查。
//     */
//    @Bean
//    public DefaultWebSecurityManager securityManager() {
//        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//        // 设置Realm
//        securityManager.setRealm(myRealm());
//        return securityManager;
//    }
//
//    @Bean
//    public ShiroRealm myRealm() {
//        return new ShiroRealm();
//    }
//
//    /**
//     * 自定义认证和授权逻辑：MyRealm 是用户自定义的 Realm，用于从数据源（如数据库或其他存储介质）中获取用户信息和权限。
//     * 核心功能：
//     * 认证：通过实现 doGetAuthenticationInfo 方法校验用户身份（如用户名和密码）。
//     * 授权：通过实现 doGetAuthorizationInfo 方法获取用户角色和权限信息。
//     * 关联到 SecurityManager：在 securityManager() 方法中将 MyRealm 设置为 SecurityManager 的数据来源。
//     */
//
//    /**
//     * 创建过滤器工厂：ShiroFilterFactoryBean 是 Shiro 提供的过滤器工厂，用于配置 Shiro 的过滤器链，定义哪些 URL 需要认证、哪些 URL 可以匿名访问。
//     * 关联 SecurityManager：通过 setSecurityManager() 方法将 SecurityManager 注入到过滤器中，使过滤器能够调用认证和授权逻辑。
//     * 配置拦截规则：
//     * 在 shiroFilter 对象中，可以通过 setFilterChainDefinitionMap() 定义 URL 拦截规则，例如:
//     * Map<String, String> filterMap = new LinkedHashMap<>();
//     * filterMap.put("/login", "anon");  // 登录接口允许匿名访问
//     * filterMap.put("/admin/**", "authc");  // 需要登录认证
//     * shiroFilter.setFilterChainDefinitionMap(filterMap);
//     * 过滤器会根据请求路径和规则决定是否放行或拦截。
//     */
//    @Bean
//    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
//        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
//        shiroFilter.setSecurityManager(securityManager);
//
//        // 添加自己的过滤器并且取名为 custom
//        // Map<String, Filter> customFilterMap = new HashMap<>();
//        // customFilterMap.put("custom", shiroCustomFilter);
//        // shiroFilter.setFilters(customFilterMap);
//
//        // 配置拦截规则
//        /**
//         * 认证过滤器：
//         * anon：无需认证即可访问，游客身份，用户可以无需认证即可访问。这通常用于登录页面，因为用户在登录之前还没有被认证。。
//         * authc：用户必须通过认证才能访问。如果用户未认证，Shiro将根据securityManager的配置将用户重定向到登录页面或者返回一个错误响应。
//         * authcBasic：需要通过 httpBasic 认证。
//         * user：不一定已通过认证，只要是曾经被 Shiro 记住过登录状态的用户就可以正常发起请求，比如 rememberMe。
//         *
//         * 授权过滤器:
//         * perms：必须拥有对某个资源的访问权限（授权）才能访问。
//         * role：必须拥有某个角色权限才能访问。
//         * port：请求的端口必须为指定值才可以访问。
//         * rest：请求必须是 RESTful，method 为 post、get、delete、put。
//         * ssl：必须是安全的 URL 请求，协议为 HTTPS。
//         */
//        // 过滤器链定义应用程序中哪些URL路径需要进行安全控制以及如何控制。过滤器链定义了每个URL路径应该应用的安全管理策略
//        Map<String, String> filterMap = new LinkedHashMap<>();
//
//        // 不需要认证
//        filterMap.put("/api/login", "anon");
//        filterMap.put("/api/logout", "anon");
//        filterMap.put("/unauth", "anon");
//        // 需要权限和角色才能访问的接口
//        filterMap.put("/api/user/list", "perms[user:list], roles[admin]");
//        filterMap.put("/api/user/add", "perms[user:add], roles[admin]");
//        filterMap.put("/api/user/delete", "perms[user:delete], roles[admin]");
//        filterMap.put("/api/user/update", "perms[user:update], roles[admin]");
//        filterMap.put("/api/role/list", "perms[role:list], roles[admin]");
//        filterMap.put("/api/role/add", "perms[role:add], roles[admin]");
//        filterMap.put("/api/role/delete", "perms[role:delete], roles[admin]");
//        filterMap.put("/api/role/update", "perms[role:update], roles[admin]");
//        filterMap.put("/api/menu/list", "perms[menu:list], roles[admin]");
//        filterMap.put("/api/menu/add", "perms[menu:add], roles[admin]");
//        filterMap.put("/api/menu/delete", "perms[menu:delete], roles[admin]");
//        filterMap.put("/api/menu/update", "perms[menu:update], roles[admin]");
//        // 所有其他请求都需要登录认证
//        filterMap.put("/**", "authc");
//        // filterMap.put("/view", "custom");
//        /**
//         *  filterMap.put("/login", "anon");
//         * filterMap.put("/unauth", "anon");
//         * filterMap.put("/view", "anon");
//         * filterMap.put("/del", "roles[admin], perms[del]");  // 需要 admin 角色 del 权限
//         * filterMap.put("/update", "roles[admin], perms[update]");  // 需要 admin 角色 update 权限
//         * filterMap.put("/user", "roles[user], perms[user]");  // 需要 user 角色 user 权限
//         * // Shiro 如何设置多个 roles 和 perms 可以访问某一个 url
//         * // 1. 允许 admin 或 manager 角色，且具备 admin:create 或 admin:delete 权限的用户访问 /admin/**
//         * filterMap.put("/admin/**", "roles[admin,manager], perms[admin:create,admin:delete]");
//         */
//
//        shiroFilter.setFilterChainDefinitionMap(filterMap);
//        //设置登录 url
//        shiroFilter.setLoginUrl("/api/login");
//        return shiroFilter;
//    }
}